"""Сервер телеграм бота"""
import logging
import os

import aiohttp
from aiogram import Bot, Dispatcher, executor, types
import exceptions
import expenses
from categories import Categories
from middlewares import AccessMiddleware


# Configure logging
logging.basicConfig(level=logging.INFO)

# Initialize bt and dispatcher

ACCESS_ID = os.getenv("TELEGRAM_ACCESS_ID")
API_TOKEN = os.getenv("TELEGRAM_API_TOKEN")
if not API_TOKEN:
    exit("Error: no token provided")

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(AccessMiddleware(ACCESS_ID))
 

@dp.message_handler(commands=['start','help'])
async def send_welcome(message: types.Message):
    await message.answer(
            "Бот для учета финансов\n\n"
            "Добавить расход : 100 такси\n"
            "Статистика за день: /today\n"
            "Статистика за месяц: /month\n"
            "Последние внесенные расходы: /expenses\n"
            "Категории расходов: /categories\n"
            "Баланс: /balance"
        )


@dp.message_handler(lambda message: message.text.startswith('/del'))
async def del_expense(message: types.Message):
    """Удаляет одну запись о расходе по её идентификатору"""
    row_id = int(message.text[4:])
    expenses.delete_expense(row_id)
    answer_message = "Удалил"
    await message.answer(answer_message)


@dp.message_handler(commands=['categories'])
async def categories_list(message: types.Message):
    """Отправляет список категорий расходов"""
    categories = Categories().get_all_categories()
    answer_message = "Категории трат:\n\n* " +\
            ("\n* ".join([c.name+' ('+", ".join(c.aliases)+')' for c in categories]))
    await message.answer(answer_message)


@dp.message_handler(commands=['today'])
async def today_statistics(message: types.Message):
    """Отправляет сегодняшнюю статистику трат"""
    answer_message = expenses.get_today_statistics()
    await message.answer(answer_message)


@dp.message_handler(commands=['month'])
async def month_statistics(message: types.Message):
    """Отправляет статистику трат текущего месяца"""
    answer_message = expenses.get_month_statistics()
    await message.answer(answer_message)


@dp.message_handler(commands=['expenses'])
async def list_expenses(message: types.Message):
    """Отправляет последние несколько записей о расходах"""
    last_expenses = expenses.last()
    if not last_expenses:
        await message.answer("Расходы ещё не заведены")
        return

    last_expenses_rows = [
        f"{expense.amount} руб. на {expense.category_name} — нажми "
        f"/del{expense.id} для удаления"
        for expense in last_expenses]
    answer_message = "Последние сохранённые траты:\n\n* " + "\n\n* "\
            .join(last_expenses_rows)
    await message.answer(answer_message)

@dp.message_handler(commands=['balance'])
async def get_balance(message: types.Message):
    """Выводит текущий баланс"""
    balance_now = expenses.get_balance()
    answer_message = (f"Текущий баланс: {balance_now[0].get('balance')} руб.") 
    await message.answer(answer_message)


@dp.message_handler()
async def add_expense(message: types.Message):
    """Добавляет новый расход"""
    try:
        expense = expenses.add_expense(message.text)
    except exceptions.NotCorrectMessage as e:
        await message.answer(str(e))
        return

    if expense.category_name == '+':
        answer_message = (
            f"Изменен баланс на: {expense.amount} руб.")
    else:
        answer_message = (
            f"Добавлены траты {expense.amount} руб на {expense.category_name}.\n\n"
            f"{expenses.get_today_statistics()}")
    await message.answer(answer_message)


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
